<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>

    <script>
      class Person {
        constructor(name) {
          this.name = name;
          console.log(this);
        }
      }
      /* 
             根据函数调用方式的不同,this的值也不同
                1. 以函数形式调用,this是window
                2. 以方法形式调用,this是调用方法的对象
                3. 构造函数中,this是新建的对象
                4. 箭头函数没有自己的this,由外部作用域决定
                5. 通过call和apply调用的函数,它们的第一个参数就是函数的this
        */
      function fn() {
        console.log('GG', this);
      }
      const obj = {
        name: 'GGGGG',
        fn,
        test() {
          const t = () => {
            console.log(this);
          };
        },
      };
      fn();
      obj.fn();
      const GG = new Person('Ddd');
      GG.fn = fn;
      GG.fn();
      obj.test();

      /* 
            调用函数除了通过 函数() 这种形式外,还可以通过其他方法来调用函数
                比如,我们可以通过函数的call()和apply()两个方法来调用函数
                函数.call()
                函数.apply()
                - call和apply除了可以调用函数意外,还可以用来指定函数中的this
                - call和apply的第一个参数会成为函数的this
                - 通过call方法调用函数,函数的实参会直接在第一个参数后一个一个的列出来
                - 通过apply方法调用函数,函数的实参需要通过一个数组来传递
       */
    function fn2(a,b){
        console.log("a="+a,"b="+b);
        console.log(this);
    }
      fn2.call(1,2,2);
      fn2.apply(2,[1,2])

    </script>
  </head>
  <body></body>
</html>
